/**
 * 所有服务类的公共类,其它服务类继承此类
 */

const AV = require("leanengine");
class BaseServ {
  constructor(moduleName, attrs) {
    this.moduleName = moduleName;
    this.attrs = attrs;
  }

  // 查找列表(所有)
  findListInterface(attrs) {
    const query = new AV.Query(this.moduleName);
    if (attrs && attrs.length > 0) {
      query.select(attrs);
    }
    return query.find();
  }

  // 添加
  addInterface(params) {
    // 创建一个实例
    const entry = new AV.Object(this.moduleName);
    // 添加对象里的所有属性
    for (let p in params) {
      entry.set(p, params[p]);
    }
    return entry.save();
  }

  // 添加并关联到某个模块
  addAndDependent(params, dependentObj) {
    // 创建一个实例
    const entry = new AV.Object(this.moduleName);
    // 添加对象里的所有属性
    for (let p in this.attrs) {
      entry.set(p, params[p]);
    }
    entry.set("dependent", dependentObj);
    return entry.save();
  }

  // 根据id删除
  delInterfaceById(objectId) {
    let entry = AV.Object.createWithoutData(this.moduleName, objectId);
    return entry.destroy();
  }

  // 根据id查询
  findInterfaceById(objectId) {
    const query = new AV.Query(this.moduleName);
    query.equalTo("objectId", objectId);
    return query.first();
  }

  /**
   *
   * @param {*} attrs 需要校验的属性数组
   * @param {*} params 前端发来的参数
   */
  checkAttr(attrs, params) {
    // 查找没有值的属性
    let res = attrs.find(attr => {
      return params[attr] === undefined || params[attr] === "";
    });
    // 没有值的属性给出提示
    if (res) {
      return {
        code: "604",
        msg: `缺少${res}`
      };
    } else {
      return false;
    }
  }

  /**
   * @param {*} arr 列表数据
   * @param {*} data 需要更改的数据{key是新属性,value是对应的属性}
   */
  changAttrs(arr, data) {
    let keys = [];
    let values = [];
    for (let p in data) {
      keys.push(p);
      values.push(data[p]);
    }

    arr.map(item => {
      keys.forEach((key, index) => {
        // 字段名称为id时,到item里面去取
        if (values[index] === "id") {
          item.attributes[key] = item.id;
          // 删除objectId
          delete item.id;
        } else {
          item.attributes[key] = item.attributes[values[index]];
        }
      });
      return item.attributes;
    });
    return arr;
  }

  /**
   * 给数据添加成功和失败的对象
   * params@type 成功的查询1,失败的查询0
   */
  addResInfo({ type, code, msg, result, error }) {
    if (type === 1 && !!result) {
      return { code: "666" };
    }
    if (type === 1 && !result) {
      return {
        code: 20001,
        msg
      };
    }

    // 以上为成功的处理,下面为失败的处理
    return {
      code: 500,
      ...error,
      msg
    };
  }
}

module.exports = BaseServ;
